# -*- coding: utf-8 -*-
import re

import scrapy
import json
from ..items import NewsItem
from news import settings


class NewSpider(scrapy.Spider):
    name = 'news'
    allowed_domains = ['pacaio.match.qq.com']
    start_urls = []  # 腾讯娱乐

    def __init__(self):
        for x in range(1, 21):
            self.start_urls.append(
                "https://pacaio.match.qq.com/irs/rcd?cid=146&token=49cbb2154853ef1a74ff4e53723372ce&ext=ent&page=" + str(x))

    # 给请求加上请求头
    def start_requests(self):
        for url in self.start_urls:
            headers = {
                'User-Agent': settings.USER_AGENTS
            }
            yield scrapy.Request(url, headers=headers)

    # 获取链接列表
    def parse(self, response):
        print("当前请求头为：")
        print(response.request.headers['User-Agent'])

        # rs = json.loads(response.text[6:-1])  # 有干扰json的字符时可以用这个去除 更具数字截取
        rs = json.loads(response.text)
        for url in rs.get('data'):
            # 解决相对路径问题
            full_url = response.urljoin(url.get('vurl'))
            yield scrapy.Request(url=full_url, callback=self.getnet, dont_filter=True,meta={'thumbnail': url.get('bimg')})

    # 对链接内的内容经行获取
    def getnet(self, response):

        # 获取标题
        title = response.xpath('//title/text()').extract_first('')

        # 获取内容
        conetnt = response.xpath('//div[@class="content clearfix"]/div[@class="content-article"]').extract_first('')

        # 缩略图
        thumbnail = response.meta['thumbnail']

        # 内容中的图片
        content_images = response.xpath(
            '//div[@class="content clearfix"]/div[@class="content-article"]//img/@src').extract()

        #  正则
        # 标题正则
        title = re.sub(r'_(.*?)', '', title)  # 因为获取的是 title中的内容，所以要对内容进行过滤

        # 内容 全局正则
        conetnt = conetnt.replace("\r", "")  # \r	回车
        conetnt = conetnt.replace("\t", "")  # \t	横向制表符
        conetnt = conetnt.replace("\n", "")  # \n	换行
        conetnt = re.findall('<div class="content-article">(.*?)          </div>', conetnt, re.S)  # 去除最外层的父类
        for conetnt in conetnt:  # 因为findall返回的是列表（也就是java中的list）,所以要将内容便利一下
            conetnt = re.sub(r'class="(.*?)"', '', conetnt)  # 去除class
            conetnt = re.sub(r'id="(.*?)"', '', conetnt)  # 去处id
            conetnt = re.sub(r'<!--(.*?)-->', '', conetnt)  # 去除注释
            conetnt = re.sub(r'<script(.*?)</script>', '', conetnt)  # 去除js
            conetnt = re.sub(r'(?<=>). *?(?=<)', '', conetnt)  # 去除><中中间的空格，但不包含><
            conetnt = re.sub(r'（.*?）', '', conetnt)  # 去除中文括号

            # 内容 自定义正则
            conetnt = re.sub(r'/1000', '.png', conetnt)
            conetnt = re.sub(r'//(.*?)/(.*?)/(.*?)/', '/zblogimg/', conetnt)  # 转换图片路径

        # 缩略图
        images = []
        for img in content_images:
            full_url = response.urljoin(img)
            images.append(full_url)

        item = NewsItem()
        item['title'] = title  # 将标题放入实体类中 的title中（python中称为实体类不知对不对，因原本是学java的）
        item['content'] = conetnt  # 将内容放入实体类中 content（python中称为实体类不知对不对，因原本是学java的）

        item['thumbnail'] = thumbnail  # 缩略图 缩略图实在 获取链接的时候 就已经获取到了

        item['content_images'] = images  # 这里的图片是要下载的而且类型是列表（在java中称坐list）,将内容中的图片放入实体类中 images(python中称为实体类不知对不对，因原本是学java的)

        yield item
